gdk/wayland: Keep track of implicit grabs
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 12 May 2020 08:19:47 +0000 (10:19 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 12 May 2020 12:14:39 +0000 (14:14 +0200)
Tracking of those broke sometime along the gdk cleanups, so we
started missing some GDK_GRAB_BROKEN events from being emitted
(eg. after a button press/implicit grab triggers an active grab).

Implicit grabs are only added if there's no prior grab (either
implicit through other button presses, or explicit), in order to
keep accounting correct, make those prevail.

gdk/gdksurface.c

index c4a058e75da6df7d403106c811c46dce03bd7575..b6ee8f577ad6482ade0b2e92e734a670a3bd18bc 100644 (file)
@@ -2293,9 +2293,29 @@ _gdk_windowing_got_event (GdkDisplay *display,
   else if (type == GDK_LEAVE_NOTIFY)
     _gdk_display_set_surface_under_pointer (display, device, NULL);
 
-  if (type == GDK_BUTTON_RELEASE ||
-      type == GDK_TOUCH_CANCEL ||
-      type == GDK_TOUCH_END)
+  if (type == GDK_BUTTON_PRESS)
+    {
+      GdkSurface *grab_surface;
+      gboolean owner_events;
+
+      if (!gdk_device_grab_info (display, device, &grab_surface, &owner_events))
+        {
+          _gdk_display_add_device_grab (display,
+                                        device,
+                                        event_surface,
+                                        GDK_OWNERSHIP_NONE,
+                                        FALSE,
+                                        GDK_ALL_EVENTS_MASK,
+                                        serial,
+                                        gdk_event_get_time (event),
+                                        TRUE);
+          _gdk_display_device_grab_update (display, device,
+                                           source_device, serial);
+        }
+    }
+  else if (type == GDK_BUTTON_RELEASE ||
+           type == GDK_TOUCH_CANCEL ||
+           type == GDK_TOUCH_END)
     {
       if (type == GDK_BUTTON_RELEASE ||
           gdk_event_get_pointer_emulated (event))